package 反射.获取类的成员变量;

import java.lang.reflect.Field;

public class Test {
    public static void main(String[] args) throws Exception {
        // Class提供了从类中获取成员变量的方法
        // 1. public Field[] getFields(): 获取类的全部成员变量 (只能获取public修饰的)
        // 2. public Field[] getDeclaredFields(): 获取类的全部成员变量(只要存在就能拿到)
        // 3. public Field getField(String name): 获取类的某个成员变量(只能获取public修饰的)
        // 4. public Field getDeclaredField(String name): 获取类的某个成员变量(只要存在就能拿到)


        // 1. 反射第一步, 必须是先得到类的Class类对象
        Class c = Cat.class;
        // 2. 获取类的全部成员变量
        Field[] field = c.getFields(); // 只能获取public修饰的
        Field[] declaredFields = c.getDeclaredFields(); // 只要存在就能拿到

        // 3. 遍历这个成员变量数组
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField.getName() + "----->" +declaredField.getType());
        }

        // 4. 定位某个成员变量
        Field name = c.getDeclaredField("name");
        System.out.println(name.getName() + "----->" + name.getType());
        Field age = c.getDeclaredField("age");
        System.out.println(age.getName() + "----->" + age.getType());

        // 获取到成员变量的作用: 依然是赋值、取值.
        // 方法:
        // 1. void set(Object obj, Object value): 赋值
        // 2. Object get(Object obj): 取值
        // 3. public void setAccessible(boolean flag): 设置为true, 表示禁止检查访问控制(暴力反射)

        // 赋值:
        Cat cat = new Cat();
        name.setAccessible(true);
        name.set(cat, "咖啡猫");
        System.out.println(cat);

        // 取值:
        String o = (String) name.get(cat);
        System.out.println(o);
    }
}
